package iterator

type Iterator interface {
	HasNext() bool
	Next() interface{}
}

// 实现的示例
// 使用的是面向对象的思维实现迭代器
type Ints struct {
	index    int
	elements []int
}

func (i *Ints) HasNext() bool {
	return i.index < len(i.elements)
}

func (i *Ints) Next() interface{} {
	val := i.elements[i.index]
	i.index++
	return val
}

// 基于闭包的方式实现迭代器
type IteratorV2 func() (int, bool)

type IntsV2 []int

func (iv2 IntsV2) Iterator() IteratorV2 {
	index := 0
	return func() (val int, ok bool) {
		if index >= len(iv2) {
			return
		}

		val, ok = iv2[index], true
		index++
		return
	}
}

type IntsV3 []int

func (iv3 IntsV3) Iterator() <-chan int {
	c := make(chan int)
	go func() {
		for _, v := range iv3 {
			c <- v
		}
		close(c)
	}()
	return c
}
